﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Lib
{
    public enum AttributeType
    {
        Numeric = 0,
        Categorical = 1,
    }

    public class DataAttribute
    {
        #region Thuoc tinh
        string name;
        /// <summary>
        /// Ten thuoc tinh
        /// </summary>
        public string AttributeName { get { return this.name; } }
        /// <summary>
        /// lay hay gan chi so (vi tri ) cua thuoc tinh
        /// </summary>
        public int Index { get; set; }
        /// <summary>
        /// Loại thuộc tính
        /// </summary>
        public AttributeType Type { get; set; }
        /// <summary>
        /// Giá trị cận dưới của thuộc tính
        /// </summary>
        double lowerBound;
        public double LowerBound
        {
            get { return lowerBound; }
            set { lowerBound = value; }
        }
        /// <summary>
        /// Giá trị cận dưới của thuộc tính
        /// </summary>
        /// 
        private double upperBound;
        public double UpperBound
        {
            get { return upperBound; }
            set { upperBound = value; }
        }
        /// <summary>
        /// Giá trị của thuộc tính
        /// </summary>
        public List<TransactionValue> AttValue { get; set; }


        public bool IsNumeric
        {
            get
            {
                return (Type == AttributeType.Numeric);
            }
        }

        public bool IsCategorical
        {
            get
            {
                return (Type == AttributeType.Categorical);
            }
        }
        #endregion

        #region Phuong thuc khoi tao

        public DataAttribute() { }

        public DataAttribute(string attName)
        {
            this.name = attName;
            this.AttValue = null;
            this.Type = AttributeType.Numeric;
            this.Index = -1;
        }

        public DataAttribute(string attName, int idx)
            : this(attName)
        {
            this.name = attName;
            this.Index = idx;
        }

        public DataAttribute(string attName, List<TransactionValue> possibleValues)
        {
            this.name = attName;
            this.Index = -1;
            if (possibleValues == null)
            {
                // AttValues = new List<string>();
                AttValue = new List<TransactionValue>();
                Type = AttributeType.Categorical;
            }
            else
            {
                //AttValues = possibleValues.Distinct().ToList();
                AttValue = possibleValues.Distinct().ToList();

                Type = AttributeType.Categorical;
            }
        }

        public DataAttribute(string attName, List<TransactionValue> possibleValues, int idx)
            : this(attName, possibleValues)
        {
            this.Index = idx;
        }
        #endregion

        #region Ham Xu li
        public object Clone()
        {
            DataAttribute copy;
            if (IsNumeric)
                copy = new DataAttribute(name);
            else
            {
                copy = new DataAttribute(name, AttValue);
            }
            copy.Index = Index;
            copy.LowerBound = lowerBound;
            copy.UpperBound = upperBound;
            return copy;
        }
        /// <summary>
        /// ham lay gia tri trong tap gia tri co the 
        /// cua thuoc tinh phan loai tai vi tri index
        /// </summary>
        /// <param name="index">Chi so cua gia tri</param>
        /// <returns></returns>
        public TransactionValue GetValueAt(int index)
        {
            if (IsNumeric) return null;
            else
            {
                if (index < 0 || index >= AttValue.Count())
                {
                    return null;
                }
                else
                {
                    return AttValue[index];
                }
            }
        }

        //public DataAttribute ConvertToAtt(TransactionValue val)
        //{ 
        //    return new DataAttribute(string.Format("{0}-{1}",v,))
        //}

        public override string ToString()
        {
            return Index.ToString() + " - "+  AttributeName;
        } 

        #endregion
    }
}
